package com.tianlh.service.exam;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.WeakHashMap;

/**
 * @author wb-tianlihui
 */
public class WeakHashMapTest {

    // 这个是为了方便测试HashMap与WeakHashMap的区别。
    //private static HashMap<Object,String> weakHashMap = new HashMap<>();
    private static WeakHashMap<Object,String> weakHashMap = new WeakHashMap<>();

    public static void main(String[] s) throws IOException {

        // 保存对象，并null out对象
        test();

        try {
            // 通知GC回收
            System.gc();
            /**
             * 如果回收后，size还是1，那请在这里加个延时。
             * 我的电脑，不需要延时，gc后，size就为0了，也就是obj被回收了
             **/
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }


        // 回收完，size为0
        System.out.println("size3="+weakHashMap.size());
        // 打印结果
        Iterator j = weakHashMap.entrySet().iterator();
        while (j.hasNext()) {
            Map.Entry en = (Map.Entry)j.next();
            System.out.println("weakmap2:"+en.getKey()+":"+en.getValue());

        }


    }

    private static void test() {

        // 创建key为obj的对象
        Object obj = new Object();

        // 以这个obj对象为key,保存value
        weakHashMap.put(obj, "这是结果");

        // 打印结果
        Iterator j = weakHashMap.entrySet().iterator();

        while (j.hasNext()) {
            Map.Entry en = (Map.Entry)j.next();
            System.out.println("weakmap:"+en.getKey()+":"+en.getValue());

        }
        // 打印map的大小，刚保存进去，所以 size为1
        System.out.println("size1="+weakHashMap.size());
        // null out the obj reference。
        obj = null;
        // 虽然obj被null了，但GC还没来得及回收，所以，size还是为1
        System.out.println("size2="+weakHashMap.size());
    }
}